package com.orgcent.activities.ainma;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;
import android.widget.ViewFlipper;

import com.orgcent.activities.R;

/**
 * 手势翻页动画 .主要用到ViewFlipper和GestureDetector.
 * ViewFlipper变化当前显示内容,GestureDetector监听手势.
 * 
 * <span> 新建一个类继承SimpleOnGestureListener，HahaGestureDetectorListener
 * 可以实现以下event事件。
 * 
 * boolean onDoubleTap(MotionEvent e) 解释：双击的第二下Touch down时触发
 * 
 * boolean onDoubleTapEvent(MotionEvent e) 解释：双击的第二下Touch
 * down和up都会触发，可用e.getAction()区分。
 * 
 * boolean onDown(MotionEvent e) 解释：Touch down时触发
 * 
 * boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float
 * velocityY) 解释：Touch了滑动一点距离后，up时触发。
 * 
 * void onLongPress(MotionEvent e) 解释：Touch了不移动一直Touch down时触发
 * 
 * boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float
 * distanceY) 解释：Touch了滑动时触发。
 * 
 * void onShowPress(MotionEvent e) 解释：Touch了还没有滑动时触发 （与onDown，onLongPress比较
 * onDown只要Touch down一定立刻触发。
 * 
 * 而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。
 * 
 * 所以Touchdown后一直不滑动，onDown->onShowPress->onLongPress这个顺序触发。 ）
 * 
 * boolean onSingleTapConfirmed(MotionEvent e) boolean onSingleTapUp(MotionEvent
 * e) 解释：上面这两个函数都是在touch down后又没有滑动（onScroll），又没有长按（onLongPress），然后Touchup时触发。
 * 
 * 点击一下非常快的（不滑动）Touchup： onDown->onSingleTapUp->onSingleTapConfirmed
 * 
 * 点击一下稍微慢点的（不滑动）Touchup：
 * onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed </span>
 * 
 * 
 */
public class GestureFlipAnima extends Activity implements OnGestureListener {
	private static final String TAG = GestureFlipAnima.class.getSimpleName();
	private ViewFlipper flipper;// ViewFlipper实例
	private GestureDetector detector;// 触摸监听实例

	private Animation leftIn;
	private Animation leftOut;
	private Animation rightIn;
	private Animation rightOut;

	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);
		setContentView(R.layout.gesture_flip_anima);

		detector = new GestureDetector(this);// 初始化触摸探测
		flipper = (ViewFlipper) this.findViewById(R.id.ViewFlipper01);// 获得ViewFlipper实例

		flipper.addView(addTextView("step 1", Color.WHITE));// 将View添加到flipper队列中
		flipper.addView(addTextView("step 2", Color.BLUE));
		flipper.addView(addTextView("step 3", Color.GREEN));
		flipper.addView(addTextView("step 4", Color.MAGENTA));
		flipper.addView(addTextView("step 5", Color.YELLOW));

		// 加载动画
		leftIn = AnimationUtils.loadAnimation(this, R.anim.left_in);
		leftOut = AnimationUtils.loadAnimation(this, R.anim.left_out);
		rightIn = AnimationUtils.loadAnimation(this, R.anim.right_in);
		rightOut = AnimationUtils.loadAnimation(this, R.anim.right_out);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		return this.detector.onTouchEvent(event);
	}

	private View addTextView(String text, int c) {
		TextView tv = new TextView(this);
		tv.setText(text);
		tv.setTextColor(Color.BLACK);
		tv.setGravity(1);
		tv.setBackgroundColor(c);
		return tv;
	}

	@Override
	public boolean onDown(MotionEvent arg0) {
		Log.i(TAG, "onDown ...");
		return false;
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		Log.i(TAG, "onFling ...");
		if (e1.getX() - e2.getX() > 120) {// 如果是从右向左滑动
			// 注册flipper的进出效果
			this.flipper.setInAnimation(leftIn);
			this.flipper.setOutAnimation(leftOut);
			this.flipper.showNext();
			return true;
		} else if (e1.getX() - e2.getX() < -120) {// 如果是从左向右滑动
			this.flipper.setInAnimation(rightIn);
			this.flipper.setOutAnimation(rightOut);
			this.flipper.showPrevious();
			return true;
		}
		return false;
	}

	@Override
	public void onLongPress(MotionEvent arg0) {
		Log.i(TAG, "onLongPress ...");
	}

	@Override
	public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
			float arg3) {
		Log.i(TAG, "onScroll ...");
		return false;
	}

	@Override
	public void onShowPress(MotionEvent arg0) {
		Log.i(TAG, "onShowPress ...");
	}

	@Override
	public boolean onSingleTapUp(MotionEvent arg0) { //
		Log.i(TAG, "onSingleTapUp ...");
		return false;
	}
}
